package com.mercury.ec.framework.air.core.client;

import com.mercury.ec.framework.air.core.client.dto.order.cancel.AirOrderCancelReqDTO;
import com.mercury.ec.framework.air.core.client.dto.order.cancel.AirOrderCancelRespDTO;
import com.mercury.ec.framework.air.core.client.dto.order.create.AirOrderCreateReqDTO;
import com.mercury.ec.framework.air.core.client.dto.order.create.AirOrderCreateRespDTO;
import com.mercury.ec.framework.air.core.client.dto.order.issue.AirOrderIssueReqDTO;
import com.mercury.ec.framework.air.core.client.dto.order.issue.AirOrderIssueRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.detr.AirDetrReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.detr.AirDetrRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.flight.AirSearchFlightReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.flight.AirSearchFlightRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.pat.AirPatReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.pat.AirPatRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.patex.AirPatexReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.patex.AirPatexRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.price.AirSearchPriceReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.price.AirSearchPriceRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.raw.AirRawReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.raw.AirRawRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.rt.AirRtReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.rt.AirRtRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.rtkt.AirRtktReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.rtkt.AirRtktRespDTO;
import com.mercury.ec.framework.air.core.client.dto.search.xsfsi.AirXsfsiReqDTO;
import com.mercury.ec.framework.air.core.client.dto.search.xsfsi.AirXsfsiRespDTO;

import javax.validation.Valid;
import java.util.List;

/**
 * 机票客户端，用于对接各机票平台
 *
 * @author hesx
 */
public interface AirClient {

    /**
     * 获得渠道编号
     *
     * @return 渠道编号
     */
    Long getId();

    /**
     * 获得渠道名称
     *
     * @return 渠道名称
     */
    String getName();

    /**
     * 航班查询
     *
     * @param reqDTO
     * @return
     */
    AirSearchFlightRespDTO getFlight(@Valid AirSearchFlightReqDTO reqDTO);

    /**
     * 获取运价
     *
     * @param reqDTO
     * @return
     */
    AirSearchPriceRespDTO getPrice(@Valid AirSearchPriceReqDTO reqDTO);

    /**
     * RT 编码提取
     *
     * @param reqDTO
     * @return
     */
    AirRtRespDTO rt(AirRtReqDTO reqDTO);

    /**
     * PAT 获取运价
     *
     * @param reqDTO
     * @return
     */
    List<AirPatRespDTO> pat(AirPatReqDTO reqDTO);

    /**
     * PATEX 获取运价
     *
     * @param reqDTO PATEX请求参数
     * @return 运价信息
     */
    List<AirPatexRespDTO> patex(AirPatexReqDTO reqDTO);

    /**
     * XSFSI 获取国际运价
     *
     * @param reqDTO XSFSI请求参数
     * @return
     */
    List<AirXsfsiRespDTO> xsfsi(AirXsfsiReqDTO reqDTO);

    /**
     * DETR 提取航班信息
     *
     * @param reqDTO DETR请求参数
     * @return 航班信息
     */
    AirDetrRespDTO detr(AirDetrReqDTO reqDTO);

    /**
     * RAW 原指令接口
     *
     * @param reqDTO
     * @return
     */
    AirRawRespDTO raw(AirRawReqDTO reqDTO);

    /**
     * RTKT 提取RTKT信息
     *
     * @param reqDTO
     * @return
     */
    AirRtktRespDTO rtkt(AirRtktReqDTO reqDTO);

    /**
     * 创建订单
     *
     * @param reqDTO
     * @return
     */
    AirOrderCreateRespDTO createOrder(AirOrderCreateReqDTO reqDTO);

    /**
     * 取消订单
     *
     * @param reqDTO
     * @return
     */
    AirOrderCancelRespDTO cancelOrder(AirOrderCancelReqDTO reqDTO);

    /**
     * 订单出票
     *
     * @param reqDTO
     * @return
     */
    AirOrderIssueRespDTO issueOrder(AirOrderIssueReqDTO reqDTO);
}
